"use strict";
var logger = require("../logger").logger;
var chalk  = require("chalk");

/**
 * $ browser-sync recipe <name> <options>
 *
 * This command will copy a recipe into either the current directory
 * or one given with the --output flag
 *
 * @param opts
 * @returns {Function}
 */
module.exports = function(opts) {
    var path = require("path");
    var fs = require("fs-extra");
    var input = opts.cli.input.slice(1);
    var resolved = require.resolve("bs-recipes");
    var dir = path.dirname(resolved);

    var logRecipes = function() {
        var dirs = fs.readdirSync(path.join(dir, "recipes"));
        logger.info(
            "Install one of the following with %s\n",
            chalk.cyan('browser-sync recipe <name>')
        );
        dirs.forEach(function(name) {
            console.log("    " + name);
        });
    };

    if (!input.length) {
        logger.info("No recipe name provided!");
        logRecipes();
        return opts.cb();
    }

    if (opts.cli.input[1] === "ls") {
        logRecipes();
        return opts.cb();
    }

    input = input[0];
    var flags = opts.cli.flags;
    var output = flags.output
        ? path.resolve(flags.output)
        : path.join(process.cwd(), input);
    var targetDir = path.join(dir, "recipes", input);

    if (fs.existsSync(output)) {
        return opts.cb(
            new Error("Target folder exists remove it first and then try again")
        );
    }

    if (fs.existsSync(targetDir)) {
        fs.copy(targetDir, output, function(err) {
            if (err) {
                opts.cb(err);
            } else {
                logger.info("Recipe copied into %s", chalk.cyan(output));
                logger.info(
                    "Next, inside that folder, run %s",
                    chalk.cyan("npm i && npm start")
                );
                opts.cb(null);
            }
        });
    } else {
        logger.info(
            "Recipe %s not found. The following are available though",
            chalk.cyan(input)
        );
        logRecipes();
        opts.cb();
    }
};
